https://leetcode.cn/problems/number-of-enclaves/
class Solution {
    typedef pair<int, int> PII;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};

public:
    int numEnclaves(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();

        vector<vector<bool>> vis(m, vector<bool>(n));
        queue<PII> q;

        // 将边界上的点放入队列
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                {
                    if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
                        if (grid[i][j]) {
                            vis[i][j] = true;
                            q.push({i, j});
                        }
                    }
                }
            }

        // 多源bfs
        while (!q.empty()) {
            auto [a, b] = q.front();
            q.pop();
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i], y = b + dy[i];
                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] &&
                    !vis[x][y]) {
                    q.push({x, y});
                    vis[x][y] = true;
                }
            }
        }

        int ret = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (!vis[i][j] && grid[i][j])
                    ++ret;
            }
        }
        return ret;
    }
};